package com.example.adminservice.utils;

import com.baomidou.mybatisplus.generator.FastAutoGenerator;
import com.baomidou.mybatisplus.generator.config.OutputFile;
import com.baomidou.mybatisplus.generator.engine.FreemarkerTemplateEngine;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

public class AutoGenerator {

    // 数据库连接信息
    private static final String URL = "jdbc:mysql://localhost:3306/book_recommend_sys_admin?useSSL=false&useUnicode=true&characterEncoding=utf-8";
    private static final String USERNAME = "root";
    private static final String PASSWORD = "1111";

    public static void main(String[] args) {
        // 需要生成代码的表
        List<String> tables = new ArrayList<>();
//        tables.add("sys_user");
//        tables.add("book");
//        tables.add("mark");chapter
//        tables.add("chapter");
        tables.add("chapter_audit");

        // 配置全局设置
        FastAutoGenerator.create(URL, USERNAME, PASSWORD)
                .globalConfig(builder -> {
                    builder.author("软工2104-李家强-2100770248")               // 作者名称
                            .outputDir("E:\\project\\myJAVAProject\\learning-microservices\\BookRecommendSystem\\admin-service\\src\\main\\java")    // 输出目录路径（到java目录）
                            .enableSwagger()           // 启用Swagger API文档
                            .commentDate("yyyy-MM-dd")  // 注释日期格式
                            .fileOverride();            // 启用文件覆盖以前生成的文件
                })
                // 配置包结构
                .packageConfig(builder -> {
                    builder.parent("com.example.adminservice")  // 父包名称
                            .moduleName("")  // 模块名称（空字符串从请求路径中删除一个级别）
                            .entity("entity")
                            .service("service")
                            .serviceImpl("serviceImpl")
                            .controller("controller")
                            .mapper("mapper")
                            .xml("mapper")
                            .pathInfo(Collections.singletonMap(OutputFile.xml, "E:\\project\\myJAVAProject\\learning-microservices\\BookRecommendSystem\\admin-service"
                                    + "\\src\\main\\resources\\mapper"));  // XML文件的输出目录路径
                })
                // 配置代码生成策略
                .strategyConfig(builder -> {
                    builder.addInclude(tables)
//                            .addTablePrefix("p_") // 指定数据库表名的前缀，生成代码时会自动忽略前缀部分，只生成以指定前缀后面的部分为表名的代码文件
                            .serviceBuilder()
                            .formatServiceFileName("%sService")  // Service文件名格式（例如SysUserService）
                            .formatServiceImplFileName("%sServiceImpl")  // Service实现文件名格式（例如SysUserServiceImpl）
                            .entityBuilder()
//                            .superClass(BaseEntity.class)  // 生成的实体的超类, 自己建的

                            // 启用Lombok注释（例如@Data，@Getter，@Setter）
                            .enableLombok()
//                            .addTableFills(new Column("create_time", FieldFill.INSERT))  // 添加create_time列的表填充
//                            .addTableFills(new Column("update_time", FieldFill.UPDATE))  // 添加update_time列的表填充
                            .logicDeleteColumnName("deleted")  // 启用逻辑删除，使用deleted列
                            .enableTableFieldAnnotation()  // 启用表字段注释（例如@TableField）

                            .controllerBuilder()
                            // 生成的控制器的超类, 自己创建的
//                            .superClass(BaseController.class)
                            .formatFileName("%sController")  // 控制器文件名格式（例如SysUserController）
                            .enableRestStyle()  // 启用RESTful风格的控制器方法映射

                            .mapperBuilder()
                            .enableBaseResultMap()  // 为所有表启用一个通用的resultMap生成
//                            .superClass(BaseMapper.class)  // 生成的Mapper的超类, 固定值
                            .formatMapperFileName("%sMapper")  // Mapper文件名格式（例如SysUserMapper）
                            .enableMapperAnnotation()  // 启用Mapper注释（例如@Mapper）
                            .formatXmlFileName("%sMapper");  // XML文件名格式（例如SysUserMapper.xml）
                })
                .templateEngine(new FreemarkerTemplateEngine()) // 使用Freemarker模板引擎（默认为Velocity）
                .execute();
    }

}

